package com.azzaou.dao.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Query;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.azzaou.dao.IFournisseurDao;
import com.azzaou.model.BonTransactionChantier;
import com.azzaou.model.Chantier;
import com.azzaou.model.Employe;
import com.azzaou.model.Fournisseur;
import com.azzaou.model.Imputation;
import com.azzaou.model.LigneTransactionChantier;
import com.azzaou.model.PaiementFournisseur;
import com.azzaou.model.TypePaiement;

public class FournisseurDao extends HibernateDaoSupport implements IFournisseurDao {

	@Override
	public List<Fournisseur> getFournisseurByCriteria(Fournisseur fournisseur) {
		 List<Fournisseur> fournisseurList = new ArrayList<Fournisseur>();
		 Query query = getSession().createQuery(" FROM Fournisseur");
		 fournisseurList = query.list();
		 return fournisseurList;
		
	}

	@Override
	public void saveOrUpdate(Fournisseur fournisseur) {
		getHibernateTemplate().saveOrUpdate(fournisseur); 

	}

	@Override
	public void remove(Fournisseur fournisseur) {
		//categorie = bonTransaction
		// marchandise = ligne
		
		List<LigneTransactionChantier> ligneList = new ArrayList<LigneTransactionChantier>();
	    Query query = getSession().createQuery(" FROM LigneTransactionChantier where bonTransactionChantier.fournisseur.id = '"+fournisseur.getId()+"'");
	    ligneList = query.list();
		
		List<BonTransactionChantier> bonList = new ArrayList<BonTransactionChantier>();
	    Query query2 = getSession().createQuery(" FROM BonTransactionChantier where fournisseur.id = '"+fournisseur.getId()+"'");
	    bonList = query2.list();
		
		
		// Set<Long> setCategorieIds = new Set<Long>();
		Map<Long, List<LigneTransactionChantier>> mapligneTransactionChantier = new HashMap<Long, List<LigneTransactionChantier>>();
		
		
		for(LigneTransactionChantier ligne : ligneList){
		if(!mapligneTransactionChantier.containsKey(ligne.getBonTransactionChantier())){
			mapligneTransactionChantier.put(ligne.getBonTransactionChantier().getId(), new ArrayList<LigneTransactionChantier>());
		}
	
		mapligneTransactionChantier.get(ligne.getBonTransactionChantier().getId()).add(ligne);
		}
		//If you want to loop over the Categories 
		
		for(BonTransactionChantier bon : bonList){
		if(mapligneTransactionChantier.get(bon.getId()) != null){
		
		for(LigneTransactionChantier ligne : mapligneTransactionChantier.get(bon.getId())){
		//DO YOU TREATMENT HERE
			getHibernateTemplate().delete(ligne);
		}
		getHibernateTemplate().delete(bon);
		}
		}		
		getHibernateTemplate().delete(fournisseur);

	}

	@Override
	public Fournisseur getFournisseurById(Long id) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Fournisseur> getAllActifFournisseur() {
		List<Fournisseur> fournisseurList = new ArrayList<Fournisseur>();
	    Query query = getSession().createQuery(" FROM Fournisseur");
	    if(query.list() == null || query.list().isEmpty())
	    {
	    	System.out.println("null");
	    }
	    else{
	    fournisseurList = query.list();}
	    return fournisseurList;
	}

	@Override
	public List<PaiementFournisseur> getListPaiements(Fournisseur fournisseur) {
		List<PaiementFournisseur> listFournisseur = new ArrayList<PaiementFournisseur>();
		
		//	Query queryy = getSession().createQuery("SELECT new EmployesAPayer(employe,sum(imputation.nombreJours), sum(imputation.nombreHeures), employe.salaireHeure, employe.salaireJour) from Imputation where dateImputation > employe.dateDernierePaie");
		    Query query = getSession().createQuery("select PaiementFournisseur where dateImputation > employe.dateDernierePaie and employe.chantier.id = '" +fournisseur.getId()+ "'");
		    if(query.list() == null || query.list().isEmpty())
		    {
		    	System.out.println("null");
		    }
		    else{
		    	listFournisseur = query.list();
		    }
		    getSession().close();

		    return listFournisseur;
	}

	@Override
	public List<TypePaiement> getAllTypePaiement() {
		List<TypePaiement> listTypes = new ArrayList<TypePaiement>();
//		Query queryy = getSession().createQuery("SELECT new EmployesAPayer(employe,sum(imputation.nombreJours), sum(imputation.nombreHeures), employe.salaireHeure, employe.salaireJour) from Imputation where dateImputation > employe.dateDernierePaie");
	    Query query = getSession().createQuery("From TypePaiement");
	   
	    	listTypes = query.list();
	    
	    getSession().close();

	    return listTypes;
	}

	public  void saveOrUpdateT(TypePaiement typePaiement) {
		// TODO Auto-generated method stub
		getHibernateTemplate().saveOrUpdate(typePaiement); 
	}

	@Override
	public void removeT(TypePaiement typePaiement) {
		getHibernateTemplate().delete(typePaiement);

	}

	@Override
	public List<TypePaiement> getTypeByCreteria(TypePaiement typePaiement) {
		StringBuffer requete = new StringBuffer("from TypePaiement where 1=1 ");

		if (typePaiement != null) {
			if (!StringUtils.isBlank(typePaiement.getLibelle())) {
			
				requete.append(" AND libelle= :libelle ");
			}
			
			}
			
		
		Query query = getSession().createQuery(requete.toString());

		if (typePaiement != null) {
			if (!StringUtils.isBlank(typePaiement.getLibelle())) {
				query.setString("libelle",typePaiement.getLibelle());
			}
			

		}

		List<TypePaiement> list = query.list();
		getSession().close();

		return list;
	}

	@Override
	public Double getDejaPaye(Fournisseur fournisseur) {
		Double dejaPaye = new Double(0);
//		Query queryy = getSession().createQuery("SELECT new EmployesAPayer(employe,sum(imputation.nombreJours), sum(imputation.nombreHeures), employe.salaireHeure, employe.salaireJour) from Imputation where dateImputation > employe.dateDernierePaie");
	    Query query = getSession().createQuery("  select SUM(montant) From PaiementFournisseur paie where fournisseur.id = '"+fournisseur.getId()+"'");
	   
	    dejaPaye = (Double)query.uniqueResult();
	    
	    getSession().close();

	    return dejaPaye;
	}

	@Override
	public Double getDuAuFournisseur(Fournisseur fournisseur) {
		Double duAuFourniss = new Double(0);
//		Query queryy = getSession().createQuery("SELECT new EmployesAPayer(employe,sum(imputation.nombreJours), sum(imputation.nombreHeures), employe.salaireHeure, employe.salaireJour) from Imputation where dateImputation > employe.dateDernierePaie");
	    Query query = getSession().createQuery(" select SUM(prixTotalTransaction) FROM BonTransactionChantier bon where bon.fournisseur.id = '"+fournisseur.getId()+"'");
	   
	    duAuFourniss = (Double)query.uniqueResult();
	    
	    getSession().close();

	    return duAuFourniss;
	}

	@Override
	public void saveOrUpdate(PaiementFournisseur paiementFrs) {
		getHibernateTemplate().saveOrUpdate(paiementFrs);
		
	}

	@Override
	public TypePaiement gettypePaiementById(Long idPaiement) {
		TypePaiement typePaie = new TypePaiement();
//		Query queryy = getSession().createQuery("SELECT new EmployesAPayer(employe,sum(imputation.nombreJours), sum(imputation.nombreHeures), employe.salaireHeure, employe.salaireJour) from Imputation where dateImputation > employe.dateDernierePaie");
	    Query query = getSession().createQuery("   From TypePaiement paie where id = '"+idPaiement+"'");
	   
	    typePaie = (TypePaiement)query.uniqueResult();
	    
	    getSession().close();

	    return typePaie;
	}
}
